from estadoFase import EstadoFase, db_session
from sqlalchemy import exc
from flask import flash
from historialRelacion import historialRelacion, HistorialRelacion
session = db_session()

class HistorialRelacionManager(object):
    """Clase encargada del manejo del historial de relaciones entre items"""
    def __init__(self):
        pass
    def __repr__(self):
        return '<HistorialRelacion Manager>'
    
    def guardarHistorialRelacion(self, historialRelacion):
        """
        Metodo encargado de almacenar una historialRelacion en la base de datos
        @param historialRelacion: Objeto historialRelacion que se desea guardar.
        """
        session.add(historialRelacion)
        try:
            session.commit()
        except exc.IntegrityError as ex:
            session.rollback()
            return flash("La historialRelacion ya existe", "error")
        except exc.FlushError as ex:
            session.rollback()
            return flash("La historialRelacion ya existe", "error")
        else:
            return flash("HistorialRelacion registrada exitosamente")
#        session.close()
        
    def eliminarRelacion(self, iditem1, iditem2):
        """
        Metodo encargado de eliminar una historialRelacion de la base de datos
        @param iditem1: id de uno de los item del historial relacion que se desea eliminar.
        @param iditem2: id del otro item del historial relacion que se desea eliminar.
        """
#        session = db_session()
        historialRelacion = session.query(HistorialRelacion).filter(HistorialRelacion.iditem1 == iditem1).\
        filter(HistorialRelacion.iditem2 == iditem2).first()
        session.delete(historialRelacion)
        session.commit()
        
    def getRelacion(self, iditem1, iditem2):
        """
        Metodo encargado de retornar el historialRelacion dados los items que la componen
        @param iditem1: id de uno de los item de la relacion que se desea obtener.
        @param iditem2: id del otro item de la relacion que se desea obtener.
        """
        historialRelacion = session.query(HistorialRelacion).filter(HistorialRelacion.iditem1 == iditem1).\
        filter(HistorialRelacion.iditem2 == iditem2).first()
        return historialRelacion
    
    def getRelaciones(self):
        """Metodo encargado de retornar todas las relaciones"""
        relaciones = session.query(HistorialRelacion).all()
        return relaciones
    
    def getHijos(self, historial):
        """ Metodo encargado de retornar la secuencia de hijos de una relacion dado el historial """
        relaciones = session.query(HistorialRelacion).filter(HistorialRelacion.idhistorialitem == historial.idhistorialitem).\
        filter(HistorialRelacion.iditem1 == historial.iditem).all()
        hijos=[]
        for relacion in relaciones: 
            hijos.append(relacion.iditem2)
            
        return relaciones
    
    def getPadres(self, historial):
        """ Metodo encargado de obtener la secuencia de padres de una relacion dado el historial """
        relaciones = session.query(HistorialRelacion).filter(HistorialRelacion.idhistorialitem == historial.idhistorialitem).\
        filter(HistorialRelacion.iditem2 == historial.iditem).all()
        padres=[]
        for relacion in relaciones: 
            padres.append(relacion.iditem1)
            
        return relaciones